home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
a_utils
/
yacc
/
flexyacc
/
aflex.lha
/
aflex
/
src
/
cclB.a
< prev
next >
Wrap
Text File
|
1993-05-31
|
4KB
|
142 lines
-- Copyright (c) 1990 Regents of the University of California.
-- All rights reserved.
--
-- This software was developed by John Self of the Arcadia project
-- at the University of California, Irvine.
--
-- Redistribution and use in source and binary forms are permitted
-- provided that the above copyright notice and this paragraph are
-- duplicated in all such forms and that any documentation,
-- advertising materials, and other materials related to such
-- distribution and use acknowledge that the software was developed
-- by the University of California, Irvine. The name of the
-- University may not be used to endorse or promote products derived
-- from this software without specific prior written permission.
-- THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
-- IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
-- WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
-- TITLE character classes routines
-- AUTHOR: John Self (UCI)
-- DESCRIPTION routines for character classes like [abc]
-- $Header: /dc/uc/self/arcadia/aflex/ada/src/RCS/cclB.a,v 1.7 1993/04/27 23:17:15 self Exp $
with MISC_DEFS, TEXT_IO, MISC, TSTRING; use MISC_DEFS, TEXT_IO;
package body CCL is
-- ccladd - add a single character to a ccl
procedure CCLADD(CCLP : in INTEGER;
CH : in CHARACTER) is
IND, LEN, NEWPOS : INTEGER;
begin
LEN := CCLLEN(CCLP);
IND := CCLMAP(CCLP);
-- check to see if the character is already in the ccl
for I in 0 .. LEN - 1 loop
if (CCLTBL(IND + I) = CH) then
return;
end if;
end loop;
NEWPOS := IND + LEN;
if (NEWPOS >= CURRENT_MAX_CCL_TBL_SIZE) then
CURRENT_MAX_CCL_TBL_SIZE := CURRENT_MAX_CCL_TBL_SIZE +
MAX_CCL_TBL_SIZE_INCREMENT;
NUM_REALLOCS := NUM_REALLOCS + 1;
REALLOCATE_CHARACTER_ARRAY(CCLTBL, CURRENT_MAX_CCL_TBL_SIZE);
end if;
CCLLEN(CCLP) := LEN + 1;
CCLTBL(NEWPOS) := CH;
end CCLADD;
-- cclinit - make an empty ccl
function CCLINIT return INTEGER is
begin
LASTCCL := LASTCCL + 1;
if (LASTCCL >= CURRENT_MAXCCLS) then
CURRENT_MAXCCLS := CURRENT_MAXCCLS + MAX_CCLS_INCREMENT;
NUM_REALLOCS := NUM_REALLOCS + 1;
REALLOCATE_INTEGER_ARRAY(CCLMAP, CURRENT_MAXCCLS);
REALLOCATE_INTEGER_ARRAY(CCLLEN, CURRENT_MAXCCLS);
REALLOCATE_INTEGER_ARRAY(CCLNG, CURRENT_MAXCCLS);
end if;
if (LASTCCL = 1) then
-- we're making the first ccl
CCLMAP(LASTCCL) := 0;
else
-- the new pointer is just past the end of the last ccl. Since
-- the cclmap points to the \first/ character of a ccl, adding the
-- length of the ccl to the cclmap pointer will produce a cursor
-- to the first free space
CCLMAP(LASTCCL) := CCLMAP(LASTCCL - 1) + CCLLEN(LASTCCL - 1);
end if;
CCLLEN(LASTCCL) := 0;
CCLNG(LASTCCL) := 0;
-- ccl's start out life un-negated
return LASTCCL;
end CCLINIT;
-- cclnegate - negate a ccl
procedure CCLNEGATE(CCLP : in INTEGER) is
begin
CCLNG(CCLP) := 1;
end CCLNEGATE;
-- list_character_set - list the members of a set of characters in CCL form
--
-- writes to the given file a character-class representation of those
-- characters present in the given set. A character is present if it
-- has a non-zero value in the set array.
procedure LIST_CHARACTER_SET(F : in FILE_TYPE;
CSET : in C_SIZE_BOOL_ARRAY) is
I, START_CHAR : INTEGER;
begin
TEXT_IO.PUT(F, '[');
I := 1;
while (I <= CSIZE) loop
if (CSET(I)) then
START_CHAR := I;
TEXT_IO.PUT(F, ' ');
TSTRING.PUT(F, MISC.READABLE_FORM(CHARACTER'VAL(I)));
I := I + 1;
while ((I <= CSIZE) and then (CSET(I))) loop
I := I + 1;
end loop;
if (I - 1 > START_CHAR) then
-- this was a run
TEXT_IO.PUT(F, "-");
TSTRING.PUT(F, MISC.READABLE_FORM(CHARACTER'VAL(I - 1)));
end if;
TEXT_IO.PUT(F, ' ');
end if;
I := I + 1;
end loop;
TEXT_IO.PUT(F, ']');
end LIST_CHARACTER_SET;
end CCL;